【初心者向け】MacにOPAをインストールしてみる
ローカルにOPAをインストールして、ポリシーを書く環境を整えるところまでやってみます。
Open Policy Agent(OPA)とは
OPAを使用することでKubernetesやTerraformに対して、ポリシーを作成して適用できます。
例えば、TerraformでAWSリソースを管理していて、特定のインスタンスタイプの作成を禁止したいとします。
その際に、特定のインスタンスタイプを禁止するポリシーをOPAで作成します。
TerraformのCI上でOPAを実行することで、ポリシー違反を検知できます。
上記はコードレビューで人力でチェックすることも可能ですが、ポリシーとして定義することで属人化せずに自動でチェックを行えます。
Open Policy Agent | Documentation
ブラウザで試せるPlaygroundも用意されているため、カジュアルに触りたい場合はこちらもおすすめです。
OPA/Regoの入門に関しては、以下のZenn 本がおすすめです。
やってみる
以下の環境で試しました。
- macOS Monterey
- Open Policy Agent: v0.54.0
OPAインストール
ローカルで使用するためには、OPAのバイナリをダウンロードする必要があります。
Homebrewでインストールすることも可能です。
$ brew install opa $ opa version Version: 0.54.0 Build Commit: Build Timestamp: Build Hostname: Go Version: go1.20.5 Platform: darwin/arm64 WebAssembly: unavailable
エディタにOPAの拡張機能をインストール
私は普段VSCodeを使用しています。
VSCodeはデフォルトでは.rego
のファイルにシンタックスチェックは行うことができません。
そのため、拡張機能「Open Policy Agent」をインストールします。
以下のような機能があります。詳細は上記のリンクをご確認ください。
- ファイル保存時のシンタックスチェック
- ファイル保存時のフォーマット
- パッケージの評価
- パッケージの選択範囲の評価
他のエディターでも拡張機能は用意されているため、お好みでインストールしてください。
Open Policy Agent | Editor and IDE Support
OPAを実行してみる
公式ドキュメントを参考にOPAを実行してみます。
今回はopa eval
を使って、作成したポリシーをテストしてみます。
Open Policy Agent | Documentation
input.json
(入力データ)とexample.rego
(ポリシー)をローカルに用意します。ファイルの中身は、公式ドキュメントの内容をコピーします。
$ touch input.json example.rego
ファイルの準備ができたら、以下のコマンドを実行してポリシーの評価を行います。
$ opa eval -i input.json -d example.rego "data.example.violation[x]" { "result": [ { "expressions": [ { "value": "busybox", "text": "data.example.violation[x]", "location": { "row": 1, "col": 1 } } ], "bindings": { "x": "busybox" } }, { "expressions": [ { "value": "ci", "text": "data.example.violation[x]", "location": { "row": 1, "col": 1 } } ], "bindings": { "x": "ci" } } ] }
ルールに違反しているci
とbusybox
が結果として返ってきます。
- busybox: protocolにtelnetを指定しているため、
violation
ルールに違反 - ci: protocolにhttpを使用しておりnetworkがpublicのため、
violation
ルールに違反
ちなみに、VSCodeの拡張機能を使うとVSCodeのコマンドで実行結果を自動でoutput.json
に出力してくれて便利です。
(コマンドパレットを開いて、OPA: Evaluate Package
)
おわりに
OPAをローカルに導入する方法でした。
VSCodeの拡張機能のおかげで、ポリシー作成が捗りそうです。
以上、AWS事業本部の佐藤(@chari7311)でした。